fix(record): cap the benchmark ENTRY, never the file -- docs/BENCHMARKS.md had 205 chars of headroom (#460) - #494
Merged
Merged
Conversation
…ock (#460) docs/BENCHMARKS.md is gated by a 45,000-character budget on the whole file and measures 44,795, so 205 characters are free. Adding a measurement row means deleting somebody else's row, and the documented way to delete one -- move it byte-for-byte into .agents/benchmark-record.md -- is broken for exactly the rows that carry evidence links, because check_links resolves a docs/-relative target from .agents/ once archived and reports it dangling. Measured over the last 25 commits that touched the page: free space ranged from 421 characters down to MINUS SEVEN. 04b2b9f is a clean automatic merge that landed the page at 45,007 chars, over the cap, because two PRs each paid for their row by evicting a different one and the three-way merge applied both additions and neither eviction. That is verbatim the corollary in AGENTS.md Records: merging two such edits cleanly is worse than conflicting. Row count fell 165 -> 162 over those commits while the project gained measurements, and two commits exist for no purpose but to pay rent (93613ba "trim the Voxtral encoder row back inside", 887e04f "compact benchmark projection"). This is the third instance of a defect this row already retired twice on 2026-08-11: 87308de removed MAX_CHARS from check-now-current.py and the chars key from STATUS_RATCHET under #364, on this exact argument. The scoreboard's own max_chars was left standing in that pass. The spec applies AGENTS.md Records rather than raising anything: cap the entry, never the file. max_chars goes; MAX_ROW_CHARS caps one row locally, so a measurement's cost is bounded by its own author; and a dated-heading regrowth guard picks up the one obligation the byte cap still discharged, the ### hole that _h2_headers never covered. That guard's shape is measured, not invented: 278 of the 301 sections already rolled into the record name a date in their heading, and 0 of the 32 live headings on the two public pages do. Per-row files and a derived page (option b) are argued against and deferred with an explicit trigger: the public scoreboard is a projection meant to be one readable page, and a committed generated file is still a file every measurement PR writes, so the lock would move rather than die. Issue: #460 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
…g fenced text a link (#460) docs/BENCHMARKS.md had 205 characters free against a 45,000-character budget on the whole file, so the next measurement row could not land without deleting a row somebody else owns, and the documented way to delete one -- move it byte-for-byte into .agents/benchmark-record.md -- did not work for exactly the rows that carry evidence links. The cap had become a ratchet nobody could pay. RED BEFORE, on 918c568. Adding the owed 35B regrid row to the live page: "docs/BENCHMARKS.md is 45098 chars, over the 45000-char scoreboard budget". Archiving the RPi5 SDOT row into the record, both as a quoted fence and as verbatim live markdown: "dangling link bench-evidence/rpi5-a76-q8-dot-20260806.md" in both directions. WHAT CHANGED, per AGENTS.md Records rather than by raising anything. 1. `max_chars` is gone from PageRules, with the measurement recorded in place. It is the third instance of a defect this row already retired twice on 2026-08-11: 87308de removed MAX_CHARS from check-now-current.py and the `chars` key from STATUS_RATCHET under #364, on this exact argument. Over the last 25 commits touching the page, free space ranged from 421 chars to MINUS SEVEN; 04b2b9f is a CLEAN automatic merge that landed it at 45,007, because two PRs each paid by evicting a different row and the three-way merge applied both additions and neither eviction. Row count fell 165 -> 162 while the project gained measurements, and two commits exist only to pay rent. 2. MAX_ROW_CHARS = 600 caps one ENTRY. An author bounds their own row and never anyone else's. Set from the shipped pages (longest live row 520 on BENCHMARKS, 580 on FEATURES) and tighter than the cell cap it joins, which alone permits a five-column row of 1,100 chars. 3. DATED_HEADING_RE is the regrowth guard and picks up the one obligation the byte cap still discharged. The canonical-section allowlist runs over _h2_headers, which matches "## " only, so an appended "### " subsection was caught by nothing but the character budget. The new guard fires at EVERY depth, which is strictly TIGHTER than what it replaces. Its shape is measured: 278 of the 301 sections already rolled into the record name a date in their heading; 0 of the 32 live headings on the two public pages do. 4. check_links no longer validates text that is not a link. A target inside a fence or an inline code span renders as literal text under CommonMark, so no reader can follow it; the old behaviour meant no document in the tree could SHOW a link in sample output. Spans are BLANKED, not deleted, so reported line numbers stay honest. Separately, .agents/benchmark-record.md now resolves a target from docs/ as well as from .agents/, because it is the declared archive of docs/BENCHMARKS.md and roll-benchmark-record.py moves sections as live markdown, which fence-stripping alone does not cover. link_base becomes link_bases; a target must still exist under one of them, and every other file keeps single-base resolution. GREEN AFTER. tests/scripts 1239 passed; the 8 failures (mlx headers, now render, 6 vulkan spirv subtests) are byte-identical on a clean 918c568 and predate this change. Both live pages pass unchanged. The acceptance test is test_the_shipped_page_can_accept_the_next_measurement_row: it adds the owed 35B regrid row to the REAL page, asserts every pre-existing row survives, and asserts the result is valid at 45,127 chars, which the retired rule refused. Per-row benchmark files and a derived page were considered and rejected in the spec: the public scoreboard is a projection meant to be one readable page, and a committed generated file is still a file every measurement PR writes, so the lock would move rather than die. Deferred as W4 with an explicit trigger. Issue: #460 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
Twelve commits landed while this row was in flight (GATE-PIN-UNPINNED-SNAPSHOTS #471 and four SPEC-DSPARK measurements #442). No conflict: they touch docs/BENCHMARKS.md, docs/FEATURES.md and .agents/roadmap_v1.md in rows this row does not own, and neither changed checker nor either mutation suite. Re-gated on the merged tree, not on the pre-merge one. tests/scripts 1258 passed, 3 skipped; the 8 failures (mlx headers, now render, 6 vulkan spirv subtests) are byte-identical on a clean e1087a8 worktree and predate this row. check-pr-size red-before/green-after OK for both checkers, check-doc-checkpoint OK, every record gate OK. docs/BENCHMARKS.md arrives at 44,859 chars: 141 free against the cap this row retires, which is the point. Issue: #460 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
Found while doing #460. roll-benchmark-record.py promises in its docstring that it and the CI gate "can never disagree", but the allowlist is not the only thing that decides: _h2_headers in check-public-doc-tables.py is a bare startswith("## ") scan with no fence tracking, while split_sections in the roll script tracks fences correctly. text = "# T\n\n## At a glance\n\n```text\n## CLAIM-FOO 2026-08-04 result\n```\n" _h2_headers(text) -> ['At a glance', 'CLAIM-FOO 2026-08-04 result'] split_sections(text) -> [('At a glance', ...)] So a heading-shaped line inside a code fence is a SECTION to the gate and NOT a section to the script the gate tells you to run, and the reported remedy prints "nothing to roll". Neither shipped page has a fenced heading today, and docs/BENCHMARKS.md carries fenced sample output in ## Reproduce, so it is one pasted line away. FILED, NOT FIXED. Correcting _h2_headers changes what an existing gate counts as a section, which per AGENTS.md needs its own spec, red-before and green-after rather than riding along in a PR scoped to the entry cap. This commit records it in the two places that must agree with the issue: the roadmap intake table and the row spec's work breakdown, as W6. The fence-aware _headings scanner added by the previous commit is the natural basis for the repair. Issue: #495 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
The spec was committed before the code, as it must be, so its Tests to port section named tests by their planned names. Six landed under different names and five more exist that it did not predict, including the headline one. A spec a reviewer cannot grep against is a spec that has started drifting from the tree. Names corrected, the acceptance test (test_the_shipped_page_can_accept_the_next_measurement_row) promoted to the top of the list where it belongs, and the RED-on-BASE message quoted for the two cases whose failure is semantic rather than an absent API. Two risks added from measurement taken after the code landed. The link-scan narrowing is 4 targets out of 4,109 across the 481 markdown files the checker scans, and all 4 are quoted samples. And an unbalanced fence blanks the rest of a file: one exists, .agents/specs/laguna-s21-scope-2026-07-30.md ends on a stray closing fence, which costs nothing because no content follows it, and the same behaviour already exists in _prose_paragraphs, _table_rows and split_sections. Making that an error is a separate rule with a separate red-before. No checker, test or public document changes. Issue: #460 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
…again Found while doing #460. MAX_README_CHARS = 30000 in check-readme-structure.py is a budget on a whole shared file, and README.md measures 29,965: THIRTY-FIVE characters free, tighter than any of the three budgets already retired for this exact reason. Measured over the last 20 commits touching README.md: 13 sat under 60 characters free, and 031410e landed the file 52 characters OVER the cap. There is a whole merged row whose only purpose was paying rent, row/DOCS-README-BUDGET (#161), plus 44206e4 "restore the landing-page budget after the MANIFESTO link". FILED, NOT FIXED. This is a third checker with its own mutation suite, so per AGENTS.md it needs its own spec and its own red-before in tests/scripts/test_check_readme_structure.py rather than riding along in a PR scoped to the two benchmark-surface checkers. Recorded in the roadmap intake table and as spec W7. Also reconciles two claims the spec made before the code existed and that the diff does not contain: docs/BENCHMARKS.md is UNCHANGED, because #481 is open and rewrites the 35B row in place, so writing a second copy of "regrid owed" would duplicate a keyed row the moment both merge. The surface's ability to accept the row is what this row owes, and it is proven by test_the_shipped_page_can_accept_the_next_measurement_row, which adds the row to the real page and drops it again: 44,832 chars and 162 rows to 45,173 and 163, errors [], every pre-existing row asserted still present. Issue: #498 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
… does not make Left over from the pre-code spec: it said "the row added here is additive and placed in ## Open gaps" and described how to resolve a conflict with #481 over it. There is no such edit. docs/BENCHMARKS.md is untouched, #481 keeps ownership of the "regrid owed" fact, and the two branches cannot conflict at all. Also records the mid-row base move, 918c568 -> e1087a8 (12 commits), and that every gate was rerun on the merged tree rather than the pre-merge one. The figures in Our baseline are as taken at 918c568 and are deliberately not restated: they are the measurement that justified the change. Spec text only. No checker, test or public document changes. Issue: #460 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
…ot see it CI on this PR turned windows-msvc-vulkan and windows-msvc-cpu red. Neither is this row's: it is a Python-only change to two governance checkers and their mutation suites, touching no src/, include/, tests/, cmake/ or .ps1 path. Both lanes are `if: github.event_name == 'pull_request'` (ci.yml:640), so the scheduled/dispatched lane scripts/main-baseline.py reads NEVER RUNS THEM. It reports "NEWEST BASELINE: GREEN at bbc482a" while both fail on every PR that reaches them, and they are not even in its `not run:` list, because they are undefined for that event rather than skipped. A GREEN verdict that silently excludes two compiling gates is the same failure mode as a green test run with cases skipped. The defect: tests/vt/test_cpu_isa_x86.cpp includes <array> <bit> <limits> <stdexcept> <string> and doctest, but not <ostream>. libstdc++ supplies it transitively; MSVC's <string_view> does not, so doctest's stringification instantiates operator<< against an undefined std::basic_ostream. Reproduced byte-for-byte on two unrelated branches: row/ENG-RELEASE-WINDOWS 673c2f3 __msvc_string_view.hpp(550,23) C2027 row/BENCHMARKS-CAP-RELIEF 104d3f3 __msvc_string_view.hpp(550,23) C2027 same file, same line, same target test_cpu_isa_x86.vcxproj, same failing step, and the cpu lane fails identically in build-pr-windows-cpu. FILED, NOT FIXED. There is no MSVC toolchain on this box, so a one-line include change would be a guess with no green-after evidence, and the file belongs to ENG-RELEASE-WINDOWS, which is in flight and red on the same job; patching it from an unrelated row would collide with the branch already working there. The second half of the repair, teaching main-baseline.py to declare jobs its lane cannot run, changes a checker's semantics and needs its own spec. Recorded in the roadmap intake table under ENG-RELEASE-WINDOWS and in this row's spec Evidence, so a reviewer of #494 does not have to re-derive whose red it is. Issue: #503 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
One SPEC-DSPARK measurement (#442) landed while this row was in review. No conflict: it edits docs/BENCHMARKS.md, docs/STATUS.md, its own spec and the benchmark record, none of which this row touches, and neither changed checker nor either mutation suite. Re-gated on the merged tree. Issue: #460 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
…d pair fences the way CommonMark does (#460) Review returned FAIL on PR #494 with two blocking findings and seven smaller ones. The design is unchanged: AGENTS.md, Records, says cap the entry, never the file, and the byte cap stays retired. F1. "Strictly tighter than the byte cap" was FALSE, and the gap was the append-log class this row's own stop condition names. `_prose_paragraphs` excluded every line starting with `-`, `*`, `>`, `|` or `#`, so a bulleted or quoted wall was counted by NOTHING: not the paragraph count, not MAX_PARAGRAPH_CHARS, not MAX_CELL_CHARS, not MAX_ROW_CHARS, and not the heading guard, which fires on a DATE. Measured: 3,000 appended bullet lines took docs/BENCHMARKS.md to 113,833 chars with the checker reporting `[]` (BASE rejects the same mutant on size), and 500 UNDATED `### Attempt N` sections with bulleted forensics reached 117,222 chars at exit 0 with 68/68 green. Fixed both ways the finding asked. The claim is corrected wherever it appeared, to the narrower true statement -- tighter than the canonical-section allowlist, which sees `## ` only -- in the checker comment, spec Design 3, spec Risks and the PR body. And the channel is closed: list items and blockquote lines fold into `_prose_paragraphs`, so a contiguous run is ONE paragraph and trips MAX_PARAGRAPH_CHARS while a run per section trips the count. BENCHMARKS carries no list item and is unmoved at 35; FEATURES carries one, so `max_prose_paragraphs` re-baselines 20 to 21; STATUS moves the other way, 82 long paragraphs to 75, so STATUS_RATCHET follows the measurement DOWN rather than banking 7 units of slack. An emphasis-lead paragraph still starts with `*` and is still excluded, so a `**bold**`-led wall remains unbounded. That is stated plainly, not glossed: closing it turns four paragraphs already shipped on docs/BENCHMARKS.md red at 717, 719, 748 and 1,084 chars against MAX_PARAGRAPH_CHARS, so it owes an edit to a page #481 holds open. Filed as #507, deferred as spec W8, and pinned by test_an_EMPHASIS_lead_wall_is_a_KNOWN_residue, which goes red the day it lands. F2. `strip_code_spans` closed a block on any line matching a fence, including one with an info string, which is not CommonMark and does not fail safe: it INVERTS fence phase for the rest of the file. With the one unbalanced fence this tree has, the bare fence at STATE-LEGACY-000001.md:17697 was "closed" by the ```sh at :17948, and ordinary prose at :18297 was blanked, so a live reader-followable link stopped being validated. A closing fence now must match the opener's character, be at least as long, and carry nothing but whitespace after the marker. Re-measured: 4,114 raw targets, 4,110 after the strip, and all 4 losses are genuine samples. The Risk said 4 and was measuring 5. F3. Deleted the `assertGreater(len(grown), RETIRED_PAGE_BUDGET)` on the LIVE page. It stored a measurement of docs/BENCHMARKS.md inside a test file with 173 chars of margin, which is the corollary this row removed; 887e04f shrank the page by 280. F4 to F9, same pass. The second-base docstring now says what it enforces (the evidence still exists under a declared base) instead of "no reader can follow it", which is false of the links it accepts, and names W5 as what would make the archived copy followable. `[`name`](path)` wrapped in stray backticks hid the non-existent target `path` in this row's own spec: fixed and pinned by a test. "Line numbers stay honest" is no longer cited as evidence, because check_links reports none. The PageRules docstring now says the no-eviction property is true of ROWS only, with both pages sitting on the paragraph count. The heading survey is re-measured: 282 of 305 archived titles dated, 0 of 36 live headings, not 278/301 and 0/32. The acceptance test inserts the owed row directly under the last Open gaps row so markdown renders it in that table. Mutation set, three trees, in spec Risks. M7, M8, M8b and M9 flip SURVIVED to CAUGHT. M6 survives by design and M11 is the filed residue. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
…e-measure the heading survey on the merged tree (#460) Review-repair follow-through, three edits and no behaviour change beyond the numbers being right. The `_prose_paragraphs` predicate no longer says which prefixes it dropped, so the inline comment now says it: "-", "+" and ">" are gone from the exclusion list entirely, which IS the fold, and the only "*" still excluded is the emphasis-lead residue filed as #507. The heading survey is re-measured on the merged tree after origin/main added sections to the archive: 284 of 307 rolled titles carry a date, against 282 of 305 an hour ago and the 278 of 301 the spec shipped with. Zero of the 36 live headings do, unchanged. The link census likewise: 4,130 raw targets, 4,122 after the strip, all 8 losses code samples, against 9 losses for the loose fence rule whose ninth is the live link F2 found. The spec's own `[`name`](path)` sample moves into a fence. Written inline it was four backticks, so the checker read it as two code spans straddling the target `path`, which is what F5 describes, and after the correction it became a dangling link the moment the surrounding prose changed shape. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
… main lands rows The heading survey and the link-extraction census are counts over the whole tree, so they move under every merge: the archive went 305 to 307 to 310 sections in the three hours this repair took, and the link total 4,114 to 4,130 to 4,170. Reporting them as bare constants makes the spec wrong on a cadence nobody controls. Both are now stated as measured at merge `fdbc8ae6`, with the reproduction command, and the spec says plainly which part is the invariant: not the totals, but that the CommonMark fence rule validates strictly MORE than the loose one and loses only samples (4,163 against 4,162, and the one extra loss is the live link at STATE-LEGACY-000001.md:18297). 287 of 310 archived section titles carry a date. Zero of the 36 live headings do, which is the number the guard actually rests on and the one that has not moved. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #460. Row
ENG-RECORD-CONFLICT-SURFACES.Spec:
.agents/specs/benchmarks-entry-cap.md.Issue table:
.agents/roadmap_v1.mdlists #460 and #507 under this row.The blocker, measured
docs/BENCHMARKS.mdwas gated by a 45,000-character budget on the wholefile and measured 44,795, so 205 characters were free. Adding a
measurement row meant deleting a row somebody else owns, and the documented way
to delete one, moving it byte-for-byte into
.agents/benchmark-record.md, didnot work for exactly the rows that carry evidence links (#460).
Over the last 25 commits that touched the page:
04b2b9fa93613baa887e04ffbbc482a2918c568aThree things follow, and AGENTS.md, Records, names each of them.
04b2b9famerged cleanly to 45,007 charsbecause two PRs each paid by evicting a different row, and the three-way
merge applied both additions and neither eviction. Verbatim the corollary:
"merging two such edits cleanly is worse than conflicting".
gained measurements. Two commits exist for no purpose but to pay rent.
carry a
docs/-relative link and none can be archived byte-for-byte.What changed
Not by raising anything. By applying AGENTS.md, Records: cap the entry, never
the file, and relocate the obligation to a per-row surface rather than
deleting it.
1.
max_charsis gone fromPageRules, with the measurement recorded inplace. This is the third instance of a defect this row already retired twice on
2026-08-11:
87308dearemovedMAX_CHARSfromcheck-now-current.pyand thecharskey fromSTATUS_RATCHET, under #364, on this exact argument.2.
MAX_ROW_CHARS = 600caps one ENTRY. An author bounds their own row andnever anyone else's. Set from the shipped pages (longest live row 520 on
BENCHMARKS, 580 on FEATURES), and tighter than the cell cap it joins, which
alone permits a five-column row of 1,100 chars.
3.
DATED_HEADING_RErejects a per-attempt heading at every depth._h2_headersmatches##only, so a dated###subsection was caught bynothing but the character budget. Shape measured, not invented: at merge
fdbc8ae6, 287 of the 310 sections already rolled into the record name adate in their heading, and 0 of the 36 live headings across the two public
pages do, 18 per page. The archive total climbs as rows land, so it is dated;
the zero is the number the guard rests on and it has not moved.
4.
_prose_paragraphscounts list items and blockquote lines. Added in thisrevision, for review finding F1. See below: this is the rule that actually
discharges the spec's stop condition.
5.
check_linksstops validating text that is not a link, and pairs fencesthe way CommonMark does. A target inside a fence or an inline code span renders
as literal text, so no reader can follow it; the old behaviour meant no document
in the tree could show a link in sample output. Separately,
.agents/benchmark-record.mdnow resolves a target fromdocs/as well as.agents/, because it is the declared archive ofdocs/BENCHMARKS.mdand therollup moves live markdown.
link_basebecomeslink_bases; the target muststill exist under one of them, and every other file keeps single-base
resolution.
Review round 2: what the FAIL found, and what it cost
An independent review confirmed the design and that every guard the PR adds is
mutation-proof, and returned FAIL on two blocking findings. Both are fixed
here, and neither is a design change.
F1: "strictly tighter than the byte cap" was FALSE
_prose_paragraphsexcluded every line starting with-,*,>,|or#. So a bulleted or blockquoted wall was counted by nothing: not theparagraph count, not
MAX_PARAGRAPH_CHARS, notMAX_CELL_CHARS, notMAX_ROW_CHARS, and not the heading guard, which fires on a date andtherefore cannot see an undated appended subsection at all.
Measured against the real checker, with the entry cap in place:
test_oversized_page_failsused)[]113833 chars, over the 45000-char scoreboard budget### Attempt Nsections with bulleted forensicsBoth halves of the finding are done.
(a) The claim is corrected wherever it appeared -- the checker comment,
spec Design §3, spec Risks, and this body. The true statement is the narrow
one: the guard is strictly tighter than the canonical-section allowlist,
which sees
##only. It is not tighter than the retired byte cap ingeneral.
(b) The channel is closed, entry-shaped where it can be. List items and
blockquote lines now fold into the paragraph running through them, so a
contiguous run is ONE paragraph: a wall trips
MAX_PARAGRAPH_CHARS, and a runper appended section trips the count. Re-baselining, all of it a
re-measurement under a larger counted population rather than slack:
docs/BENCHMARKS.mdcarries no list item: unmoved at 35 of 35.docs/FEATURES.mdcarries one:max_prose_paragraphs20 to 21.docs/STATUS.mdshares the function and moves the other way, because its29 list items now join neighbouring paragraphs instead of splitting them:
STATUS_RATCHET["long_paragraphs"]82 down to 75, and the ceiling intest_the_status_ratchet_only_ever_moves_downwith it. Leaving 82 would havebanked 7 units of slack this row did not earn.
Stated plainly, because it is the honest half. A line opening with emphasis
still starts with
*and is still excluded, so a**bold**-led prose wall isunbounded. Closing it turns FOUR paragraphs already shipped on
docs/BENCHMARKS.mdred againstMAX_PARAGRAPH_CHARS(717, 719, 748 and 1,084chars), so it owes an edit to a page #481 holds open and it changes what an
existing gate counts. Filed as #507, deferred as spec W8, and pinned by
test_an_EMPHASIS_lead_wall_is_a_KNOWN_residue, which goes red the day itlands.
F2:
strip_code_spansmis-paired fences and stopped validating a LIVE linkThe tracker closed a block on any line matching a fence, including one with an
info string. CommonMark requires a closing fence to carry none, and getting it
wrong does not fail safe: it inverts fence phase for the rest of the file.
With the one unbalanced fence this tree already has, the bare fence at
.agents/completed/state-events/0000-00/STATE-LEGACY-000001.md:17697was"closed" by the
```shat:17948, and ordinary prose two lines under an H2at
:18297was blanked. A live, reader-followable spec link stopped beingvalidated.
A closing fence must now match the opener's character, be at least as long, and
carry nothing but whitespace after the marker. Re-measured on the merged tree:
The corrected rule validates strictly MORE, and all 7 of its losses are code
samples: 3 inside the unclosed block in the legacy file, 4 the
pathplaceholder in this row's own spec. The one target only the loose rule drops is
the live link at
:18297. Both totals climb as the tree gains markdown, so thespec dates them to a SHA rather than treating them as constants; the invariant
is the inequality, not the counts. The Risk section previously said 4 lost and
"all 4 are quoted samples", which was both stale and wrong: the review
re-measured 5, and the fifth was the live link.
F3 to F9, taken in the same pass
assertGreater(len(grown), RETIRED_PAGE_BUDGET)from theLIVE-page acceptance test. It stored a measurement of
docs/BENCHMARKS.mdinside a test file with 173 characters of margin, which is exactly the
corollary this PR removes;
887e04ffshrank the page by 280 and93613baaby 43.
test_a_new_row_costs_no_evictionmakes the point on a synthetic pageit builds itself, and
test_no_page_carries_a_whole_file_size_budgetholdsthe invariant.
can follow it", which is false of the links it accepts: a reader clicking
USAGE.mdorbench-evidence/...inside.agents/benchmark-record.mdgets a404. It now says what it enforces, that the evidence still exists under a
declared base, and names W5 as what would make the archived copy followable.
pathin this spec's own prose. Fixed there, and pinned bytest_a_link_straddled_by_two_INLINE_SPANS_is_not_extracted, which alsoasserts the ordinary backticked-label form is still a link.
check_linksreports no line numbers. Blanking is kept, and documented as aproperty held for a future caller rather than a benefit realised now.
PageRulesdocstring now says the no-eviction property is true ofROWS only.
max_prose_paragraphsis a whole-page count and both pages siton it (35 of 35, 21 of 21). Deliberate, on the same line Shared record surfaces are a lock: 16/29 open PRs conflict, 13 of them in bookkeeping only #364 drew: rows are
how a keyed table grows, prose is how it decays.
_headingsfinds 18 per page, 36 total (the old 32 was
_h2_headers-shaped), and thearchive is 284 of 307 dated, not 278 of 301.
Open gaps row, with no blank line, so markdown renders it inside that table.
It previously proved the checker claim but not the placement.
Mutation table
Reproduced on three trees with the same harness: BASE
origin/main, the firstrevision of this row (
1eef2e08), and what lands.##appended###appended###+ bulletsdocs/-relative link**bold**-lead paragraphsTwo mutants the byte cap caught are not caught after this row, and both are
named rather than glossed. M6 is the point of the row: rows are the growth
mode of a keyed table, each is capped at 600, and nobody pays for one by
deleting another's. M11 is a defect, filed and deferred with the reason
attached.
Proof a new row lands with nothing evicted
test_the_shipped_page_can_accept_the_next_measurement_rowadds the owed 35Bcanonical regrid row (the one #481 records as owed) to the real page,
directly under the last Open gaps row:
The row is added and dropped inside the test, so this PR does not edit the page
and does not collide with #481.
Gates
python3 -m pytest tests/scripts/ -q --continue-on-collection-errors:identical result on a clean
origin/mainworktree, verified rather thanassumed.
tests/scripts/test_cpu_kernel_bench.pyis a standalonesys.argv-driven harness and errors at collection on both trees; it isuntouched here and last changed in
ae6223a8.python3 scripts/check-public-doc-tables.py: OK.python3 scripts/check-agent-record.py: OK.scripts/agent-preflight.sh --staged: all record gates ok.windows-msvc-*is NOT this row's:maindoes not compile underMSVC (
tests/vt/test_cpu_isa_x86.cpplacks<ostream>), and the lanes arePR-only so
main-baseline.pynever runs them and reports main GREEN. Filed asmain does not compile under MSVC, and main-baseline.py reports GREEN because windows-msvc-* are PR-only jobs it never runs #503. This PR touches no
src/,include/,tests/vt/,cmake/or.ps1path.
What was rejected
Fixing
check_linksalone. It unblocks payment and leaves the ratchet:every measurement would still evict a row someone else owns, and the clean merge
of two such payments would still land the page over budget, as
04b2b9fadid.Per-row benchmark files or a derived page. The three admissible shapes in
Records govern record surfaces;
docs/BENCHMARKS.mdis a projection whosepurpose is to be one readable page reached from the README badge. "Derived at
read time" removes the lock only when the rendered artifact is not committed,
and GitHub renders committed markdown with no build step, so the generated page
would still be a file every measurement PR writes: the lock moves, it does not
die. Deferred as spec W4 with an explicit trigger.
Applying
is_canonicalat every heading depth, the reviewer's alternativefor F1(b). It catches M7 but not M8: a bulleted wall carries no heading at all,
so a heading rule cannot reach it. It would also freeze the six live
###subject titles on the scoreboard behind an allowlist, which contradicts
test_a_new_subject_subsection_is_allowed. The paragraph fold catches bothmutants with one mechanism and no allowlist.
Raising a cap. The line
max_charsstood on already recorded why thatfails: the previous occupant "answered it by adding slack to the constant, which
only postponed it to the next cadence of parallel work".
Filed while here, not fixed here
#507:
_prose_paragraphsexcludes any line starting with*, so anEMPHASIS-lead prose wall is counted by nothing. Closing it owes an edit to four
already-shipped
docs/BENCHMARKS.mdparagraphs on a page #481 holds open, andit changes what an existing gate counts. Spec W8.
#495:
_h2_headersis a barestartswith("## ")scan whilesplit_sectionsinroll-benchmark-record.pytracks fences, so aheading-shaped line inside a code fence is a section to the gate and not to the
script the gate tells you to run. Spec W6.
#498:
MAX_README_CHARS = 30000is the same whole-file lock, andREADME.mdmeasures 29,965: 35 characters free, tighter than any of thethree budgets already retired. Spec W7.
FOLLOWING_AGENTS_PROTOCOL
Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]